package curso.maven.infra.servico;

/**
 * Localiza objetos de servico.
 */
public abstract class LocalizadorServico {
	private static LocalizadorServico INSTANCIA_PADRAO;
	
	/**
	 * @return a instancia padrao registrada.
	 * @throws ExcecaoLocalizadorServico caso nao exista uma instancia padrao registrada.
	 */
	public static LocalizadorServico instanciaPadrao() {
		if (INSTANCIA_PADRAO == null) {
			throw new ExcecaoLocalizadorServico("Nenhuma instancia padrao registrada");
		}
		return INSTANCIA_PADRAO;
	}
	
	/**
	 * Pode ser usada por implementacoes deste LocalizadorServico para registrar
	 * uma instancia padrao.
	 * @param localizadorServico o localizador a ser usado como instancia padrao.
	 */
	protected void registrarInstanciaPadrao(LocalizadorServico localizadorServico) {
		INSTANCIA_PADRAO = localizadorServico;
	}
	
	/**
	 * Obtem um servico de determinado tipo.
	 * @param tipoServico o tipo ou super tipo do servico.
	 * @return o servico encontrado do tipo especificado.
	 * @throws ExcecaoLocalizadorServico caso nao exista um servico do tipo especificado.
	 */
	public abstract <T> T servicoPorTipo(Class<T> tipoServico);

	/**
	 * Obtem um servico de determinado tipo por nome.
	 * @param tipoServico o tipo ou super tipo do servico.
	 * @param nomeServico o nome do objeto de servico.
	 * @return o servico encontrado do tipo e nome especificados.
	 * @throws ExcecaoLocalizadorServico caso nao exista um servico do tipo e nome especificados.
	 */
	public abstract <T> T servicoPorNome(Class<T> tipoServico, String nomeServico);
}
